/* 
 * File:   JClientStub.h
 * Author: johnneyshi
 *
 * Created on 2013年5月14日, 下午8:10
 */

#ifndef JCLIENTSTUB_H
#define	JCLIENTSTUB_H

#include "JWorkingCopies.h"
#include "JInOutPut.h"
#include "JCommitConflict.h"
#include "JUpdateConflict.h"
#include "JRepositoryOperationResult.h"
#include "JString.h"
#include "JClientSVN.h"

/*为了确定调用一个函数，首先需要序列化这个函数的函数名，然后序列化这个函数的所有参数类型，然后序列化这些参数的数据
 * 这里面的函数的第一个参数都是JInOutPut&，但是在序列化的函数中，不包含这个第一个参数
 * 这里面的每一个函数，在开始的时候，都需要把pStream置为空
 * 这个函数完成把参数序列化到文件，然后发送给client，从client接受读取文件，反序列化出返回值
 */
class JClientStub 
{
public:
    JClientStub();
    virtual ~JClientStub();
    JRepositoryOperationResult GetLock(JWorkingCopies& _workingCopies,JString& _lockType);
    JRepositoryOperationResult ReleaseLock(JWorkingCopies& _workingCopies);
    JCommitConflict Commit(JWorkingCopies& _workingCopies,JWorkingCopiesBaseFile& _copyBaseFile,JBaseFile& _baseFile);
    JUpdateConflict Update(JWorkingCopies& _workingCopies,JWorkingCopiesBaseFile& _copyBaseFile,JBaseFile& _baseFile);
private:
    //这个函数是把pStrea发送到客户端的Send函数
    void SendDataToClient();
    void GetDataFromClient();
    JInOutPut* pOutStrea;
    JInOutPut* pInStrea;
    JClientSVN clientSVN;
    /*生成根之前调用，这是位了避免重复代码*/
    void StubHead();
    /*生成根之后调用，传入参数为返回值*/
    void StubTail(JStubArgument& _returnValue);
};

#endif	/* JCLIENTSTUB_H */

